package com.shuaiche.yeguan.ui.login;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.TypedValue;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.modules.core.DeviceEventManagerModule;
import com.geetest.onelogin.OneLoginHelper;
import com.geetest.onelogin.config.AuthRegisterViewConfig;
import com.geetest.onelogin.config.OneLoginThemeConfig;
import com.geetest.onelogin.config.UserInterfaceStyle;
import com.geetest.onelogin.listener.AbstractOneLoginListener;
import com.shuaiche.yeguan.MainActivity;
import com.shuaiche.yeguan.R;
import com.shuaiche.yeguan.SCApplication;
import com.shuaiche.yeguan.config.HttpUrl;
import com.shuaiche.yeguan.config.SCAppConfig;
import com.shuaiche.yeguan.config.SCUserInfoConfig;
import com.shuaiche.yeguan.model.BaseResponseModel;
import com.shuaiche.yeguan.model.SCUserInfoResponse;
import com.shuaiche.yeguan.net.http.HttpCallBack;
import com.shuaiche.yeguan.net.http.HttpHelper;
import com.shuaiche.yeguan.util.DensityUtils;
import com.shuaiche.yeguan.util.DeviceHelper;
import com.shuaiche.yeguan.util.SPUtils;
import com.shuaiche.yeguan.util.ToastShowUtils;

import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * OneLogin 工具类
 * 管理一键登录 SDK 的初始化、预取号/取号，以及通过获取的 token 请求服务端换取手机号
 */
public class OneLoginUtils {

    private static final String TAG = "OneLoginUtils";

    private Handler backHandler;
    private Handler mainHandler = new Handler(Looper.getMainLooper());
    private Activity context;
    private Activity oneLoginActivity;
    private OneLoginResult oneLoginResult;
    private ProgressDialog progressDialog;

    public static final int ONELOGIN_FULLSCREEN_MODE = 2;
    public static final int SUCCESS_CODE = 200;

    /**
     * 一键登录取号时是否使用自定义 loading 对话框
     */
    private boolean useCustomLoading = true;

    private boolean needAuth, needRegister;

    public OneLoginUtils(Activity context, OneLoginResult oneLoginResult) {
        this.context = context;
        this.oneLoginResult = oneLoginResult;
        HandlerThread handlerThread = new HandlerThread("oneLogin-demo");
        handlerThread.start();
        backHandler = new Handler(handlerThread.getLooper());
    }

    /**
     * 初始化注册接口
     */
    public static void init(Context context) {
        OneLoginHelper.with()
                //开启日志打印功能，Release 版本可以关闭
                .setLogEnable(true)
                /**
                 * OneLogin 与 OnePass 属于不同的产品，注意产品 APPID 不可混用，请在后台分别申请对用的 APPID
                 */
                .init(context, SCAppConfig.APP_ID_OL)
                //新的 init 接口第二个参数支持配置 APP_ID，register 接口无需重复配置，可传空字符串
                .register(null, 8000);
        /**
         * register 方法建议在应用启动或进入登录页的前一个页面、用户登出时时调用
         * 1. 提前注册用于提前预取号，便于快速拉起授权页
         * 2. 用户退出登录后，再次调用重新预取号，方便下次登录能迅速进入授权页
         */
    }

    /**
     * 配置页面布局(默认竖屏)
     * 注意事项：
     * 1. 配置项的图片，地址都应为`drawable`目录下资源文件名称，支持配置静态 png/jpg 图片，或者带状态选择的 xml 文件
     * 2. OffsetY 与 OffsetY_B 两者必须有一个值为 0,偏移量以不为 0 的方向作为基准。
     * 3. 颜色为int类型
     *
     * @return config
     */
    private OneLoginThemeConfig initConfig() {
        int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
        int screenHeight = context.getResources().getDisplayMetrics().heightPixels;
        int width = DensityUtils.px2dip(context, screenWidth);
        int popWidth = width * 4 / 5;
        int popHeight = DensityUtils.px2dip(context, screenHeight) * 3 / 5;
        int navigationHeight = DensityUtils.px2dip(context, getNavigationBarHeight(context));

        return new OneLoginThemeConfig.Builder()

                .setStatusBar(0xffffffff, UserInterfaceStyle.DARK, true)
                .setAuthNavLayout(0xffffffff, 50, false, false)
                .setAuthNavTextView("登录", 0xFF222222, 18, false, "", 0xFF222222, 18)
                .setAuthNavTextViewTypeface(Typeface.defaultFromStyle(Typeface.BOLD), Typeface.defaultFromStyle(Typeface.NORMAL))
                .setAuthNavReturnImgView("ic_back", 18, 15, false, 15)
                .setLogoImgView("login_logo", 85, 85, false, 110, 0, 0)
                // 一键登录背景支持配置带状态选择器 selector 的 drawable，配合 setLogBtnDisableIfUnChecked 接口可实现登录按钮状态随选择框选中状态切换
//                        .setLogBtnLayout("bg_yellow_radius6", 320, 45, 275, 0, 0)
                .setLogBtnTextView("一键登录", 0xFF222222, 18)
                .setLogBtnLayout("bg_yellow_radius6","bg_gray_login_radius6", 320, 45, 275, 0, 0)
                .setLogBtnLoadingView(useCustomLoading ? "" : "umcsdk_load_dot_white", 20, 20, 12)
                .setNumberView(0xFF000000, 20, 190, 0, 0)
                .setSwitchView("切换账号", 0xFF3973FF, 14, true, 250, 0, 0)
                // .setSwitchViewLayout("", switchWidth, 25)
                .setSloganView(0xFF333333, 14, 0, 80, 0)
                .setPrivacyLayout(280, 0, 18, 0, true)
                .setPrivacyUnCheckedToastText("请选择同意用户协议")
                .setPrivacyCheckBox("icon_radio_unchecked", "icon_yellow_checked", false, 14, 14, 4)
                .setPrivacyClauseView(Color.parseColor("#999999"), Color.parseColor("#ff9c00"), 12)
                .setPrivacyClauseViewTypeface(Typeface.defaultFromStyle(Typeface.BOLD), Typeface.defaultFromStyle(Typeface.NORMAL))
                /**
                 *连续四个参数为一组隐私协议条款 第一个为条款说明前缀或者分隔字符，第二个为条款名称，第三个为条款 URL，第四个为说明后缀或者分隔字符
                 *任意一组留空，SDK 会自动添加运营商隐私条款，留空的位置可前后调整。
                 */
//                        .setPrivacyClauseTextStrings("登录即同意", "应用自定义服务条款一", "http://a.b.c", "",
//                                "和", "应用自定义服务条款二", "http://x.y.z", "",
//                                "和", "应用自定义服务条款三", "http://x.y.z", "",
//                                "和", "", "", "并使用本机号码登录")
                .setPrivacyClauseTextStrings(
                        "我已阅读并同意", "", "", "",
                        "、", "隐私政策", SCAppConfig.URL_PROTOCOL_PRIVACY, "",
                        "与", "用户协议", SCAppConfig.URL_PROTOCOL_SERVICE, "并使用本机号码登录"
                )
                .setPrivacyAddFrenchQuotes(true)

                .build();

//        return new OneLoginThemeConfig.Builder()
//                .setLogBtnLoadingView("loading_icon", 20, 20, 12)
//                .setAuthNavReturnImgView("gt_one_login_ic_chevron_left_black", 40, 40, false, 8)
//                .build();
    }

    /**
     * 自定义控件
     * 注意：横屏的自定义控件的边距需要自己再重新按照设计图设计
     * Demo中自定义控件只支持竖屏，横屏的自定义控件需要自己实现
     */
    private void initView() {
        Button mTitleBtn = new Button(context);
        mTitleBtn.setText("其他");
        mTitleBtn.setTextColor(0xff000000);
        mTitleBtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
        mTitleBtn.setBackgroundColor(Color.TRANSPARENT);
        RelativeLayout.LayoutParams mLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        mLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
        mTitleBtn.setLayoutParams(mLayoutParams);


        Button mBtn = new Button(context);
        mBtn.setText("其他方式登录");
        mBtn.setTextColor(0xff3a404c);
        mBtn.setBackgroundColor(Color.TRANSPARENT);
        mBtn.setTextSize(TypedValue.COMPLEX_UNIT_SP, 13);
        RelativeLayout.LayoutParams mLayoutParams1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        mLayoutParams1.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
        mLayoutParams1.setMargins(0, DensityUtils.dip2px(context, 400), 0, 0);
        mBtn.setLayoutParams(mLayoutParams1);
    }

    public void setLoginNeedInfo(boolean needRegister, boolean needAuth) {
        this.needRegister = needRegister;
        this.needAuth = needAuth;
    }

    /**
     * 定义的第三方登录设置
     */
    private void initLogin() {
        LayoutInflater inflater1 = LayoutInflater.from(context.getBaseContext());
        RelativeLayout relativeLayout = (RelativeLayout) inflater1.inflate(R.layout.gt_demo_layout_other_login, null);
        RelativeLayout.LayoutParams layoutParamsOther = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        layoutParamsOther.setMargins(0, DensityUtils.dip2px(context, 360), 0, 0);
        layoutParamsOther.addRule(RelativeLayout.CENTER_HORIZONTAL);
        relativeLayout.setLayoutParams(layoutParamsOther);

        relativeLayout.findViewById(R.id.tv_other_login).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("----","=============================");
                context.startActivity(new Intent(context, LoginActivity.class));
                OneLoginHelper.with().dismissAuthActivity();
                if (context != null && context instanceof OneLoginDialogStyleActivity) {
                    context.finish();
                }
            }
        });

//        /**
//         * 添加自定义控件，addOneLoginRegisterViewConfig 调用多次可添加多个自定义控件，用不同的 id 区分
//         * 注意添加的控件不要覆盖下面原有的控件，不然可能导致无法点击的问题
//         */
        OneLoginHelper.with().addOneLoginRegisterViewConfig("title_button", new AuthRegisterViewConfig.Builder()
                        .setView(relativeLayout)
                        .setRootViewId(AuthRegisterViewConfig.RootViewId.ROOT_VIEW_ID_BODY)
                        .setCustomInterface(context -> {
//                    Utils.toastMessage(context, "动态注册的其他按钮");
                        })
                        .build()
        );
    }

    /**
     * 取号接口
     * 在这个方法里也可以配置自定义的布局页面
     * 比如    initView() initLogin()
     * 注意:0.8.0之后的版本loading由用户自己控制消失时间
     */
    public void requestToken() {
//        if (Holder.with().getOneLoginStyle() == SCAppConfig.ONELOGIN_FULLSCREEN_MODE) {
//            //三方登录自定义 UI 配置，可选配
//        }
        initLogin();
        OneLoginHelper.with().requestToken(initConfig(), oneLoginListener);
    }

    /**
     * 为了避免内存泄漏，建议设计为静态内部类
     */
    private AbstractOneLoginListener oneLoginListener = new AbstractOneLoginListener() {
        /**
         * 拉起授权页、点一键登录取号以及授权页其他用户操作的回调
         * @param jsonObject
         */
        @Override
        public void onResult(final JSONObject jsonObject) {
            Log.i(TAG, "取号结果为：" + jsonObject.toString());
            try {
                int status = jsonObject.getInt("status");
                //status=200 表示取号成功，可携带 process_id、token、authcode 去服务端换取手机号
                if (status == SUCCESS_CODE) {
                    final String process_id = jsonObject.getString("process_id");
                    final String token = jsonObject.getString("token");
                    /**
                     * authcode值在电信卡通过 token 换取手机号时必要参数，为了避免服务端校验出错，尽量三网都传
                     */
                    final String authCode = jsonObject.optString("authcode");
                    backHandler.post(() -> verify(process_id, token, authCode));
                    return;
                } else {
                    //在页面返回失败的情况下 如果不注重实用返回的监听事件，可以对于返回的事件不进行处理
                    String errorCode = jsonObject.getString("errorCode");
                    if (errorCode.equals("-20301") || errorCode.equals("-20302")) {
                        onVerifyEnd();
                        Log.d(TAG, "用户点击返回键关闭了授权页面");
                        return;
                    } else if (errorCode.equals("-20303")) {
                        // 用户选择切换账号登录，收到此回调后可关闭授权页，跳转或降级走其他方式登录，或者待用户选择
//                    // 重新拉起授权页进行一键登录
                        Log.d(TAG, "用户点击切换账号");
                    } else {
//                    //其他错误码产生原因与处理方式，请参考部署文档中的错误码说明
////                    Utils.toastMessage(context, "取号失败:" + jsonObject.toString());
//                    ToastShowUtils.showFailedToast("取号失败:" + jsonObject.toString());
                        goToLogin();
                    }
                }
            } catch (JSONException e) {
//                Utils.toastMessage(context, "取号失败:" + jsonObject.toString());
//                ToastShowUtils.showFailedToast("取号失败:" + jsonObject.toString());
                goToLogin();
            }
            onVerifyEnd();
            OneLoginHelper.with().dismissAuthActivity();
        }

        /**
         * 授权页面点击隐私协议条款的回调
         * 如有需要自定义隐私条款页，可在此回调中跳转到自定义隐私条款页展示隐私条款
         * 自定义隐私条款页参考 setPrivacyLayout 接口说明
         * @param name 隐私条款名字
         * @param url  隐私条款URL
         */
        @Override
        public void onPrivacyClick(String name, String url) {
            Log.d(TAG, "当前点击了隐私条款名为：" + name + "---地址为:" + url);
        }

        /**
         * 授权页点击一键登录按钮的回调
         */
        @Override
        public void onLoginButtonClick() {
            Log.d(TAG, "当前点击了登录按钮");
        }

        /**
         * 授权页点击切换账号按钮的回调
         * 2.1.4 版本新增，同时 onResult 回调中仍然会返回 -20303 返回码的回调结果
         */
        @Override
        public void onSwitchButtonClick() {
            super.onSwitchButtonClick();
        }

        /**
         * 授权页点击标题栏返回按钮或者手机返回键的回调
         * 2.1.4 版本新增，同时 onResult 回调中仍然会返回 -20301 和 -20302 返回码的回调结果
         */
        @Override
        public void onBackButtonClick() {
            super.onBackButtonClick();
        }

        /**
         * 拉起授权页时返回脱敏手机号的回调
         * @param phone 脱敏手机号
         */
        @Override
        public void onRequestTokenSecurityPhone(String phone) {
            super.onRequestTokenSecurityPhone(phone);
        }

        /**
         * 授权页点击一键登录按钮后开始启动 loading 的回调
         * 当用户未集成第三方验证时，onLoginButtonClick 与 onLoginLoading 先后几乎同时发回
         * 当用户集成了第三方验证时，onLoginButtonClick 在点击一键登录时立即发回调，
         *  onLoginLoading 在验证结束后开始取号时发回调
         */
        @Override
        public void onLoginLoading() {
            Log.d(TAG, "开始加载 loading");
            /**
             * 如需自定义对话框式 loading，可在此处开始显示自定义 loading 对话框
             */
            if (useCustomLoading && oneLoginActivity != null) {
                progressDialog = ProgressDialog.show(oneLoginActivity, null, "一键登录取号中", true, true);
            }
        }

        /**
         * 拉起授权页成功时授权页 Activity 创建时的回调
         * @param activity 授权页 Activity 实例
         */
        @Override
        public void onAuthActivityCreate(Activity activity) {
            Log.d(TAG, "当前弹起授权页面:" + activity.getClass().getSimpleName());
            // 如需设置弹框模式背景蒙层透明度，可在此处设置
            //activity.getWindow().setDimAmount(0.8f);

            // 保存当前授权页 Activity 实例，可用于弹出自定义弹框。
            // 如果用授权页之前的 Activity 作为 Context，弹出的对话框会被授权页遮盖
            if (useCustomLoading) {
                oneLoginActivity = activity;
            }
        }

        /**
         * 一键登录授权页跳转第三方登录后的 onActivityResult 回调
         * OneLoginActivity 覆写(Override) 了 onActivityResult 回调，
         *  并通过 onAuthActivityResult 回调透传全部参数
         *
         * @param requestCode 请求码
         * @param resultCode  结果码
         * @param data        返回数据
         */
        @Override
        public void onAuthActivityResult(int requestCode, int resultCode, Intent data) {
            super.onAuthActivityResult(requestCode, resultCode, data);
            // 解析返回参数，处理登录结果
            // 如成功则关闭一键登录授权页，更新登录状态，或者跳转登录成功后的页面
            // 失败时，可继续停留在一键登录授权页面，可继续登录

        }

        /**
         * 点一键登录之前用户可增加一些其他额外的校验功能，防止被异常攻击
         * @return true 接入其他验证, 验证成功结束后调用 requestTokenDelay 启动正常取号
         *         false 默认验证
         */
        @Override
        public boolean onRequestOtherVerify() {
            return super.onRequestOtherVerify();
        }

        /**
         * 用户点击授权页隐私条款项跳转到隐私页显示隐私条款内容，隐私页 Activity 创建时的回调
         * 用户若自定义了隐私页，就不会受到该回调
         * @param activity 隐私条款页 Activity 实例
         */
        @Override
        public void onAuthWebActivityCreate(Activity activity) {
            Log.d(TAG, "当前弹起授权Web页面:" + activity.getClass().getSimpleName());
        }

        /**
         * 授权页隐私栏选择框点击事件回调
         * @param isChecked 选择框当前的选择状态
         */
        @Override
        public void onPrivacyCheckBoxClick(boolean isChecked) {
            Log.d(TAG, "当前点击了CheckBox, CheckBox 选择状态:" + isChecked);
        }
    };

    private void goToLogin(){
        Intent intent = new Intent(context, LoginActivity.class);
        context.startActivity(intent);
    }

    /**
     * 手机号校验接口 需要网站主配置相关接口进行获取手机号等操作
     * 在这个阶段，也需要调用 OneLoginHelper.with().dismissAuthActivity() 来进行授权页的销毁
     * 注意: 0.8.0 之后的版本 loading 由用户自己控制消失时间
     */
    private void verify(String id, String token, String authCode) {


        Map<String, String> geetest = new HashMap<>();
        geetest.put("process_id", id);
        geetest.put("token", token);
        geetest.put("authcode", authCode);
        JSONObject geetjson = new JSONObject(geetest);

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("source", 14);
            jsonObject.put("version", DeviceHelper.getAppVersion());
            jsonObject.put("loginType", 4);

            jsonObject.put("geetest", geetjson);
            jsonObject.put("authorCode", "");
            jsonObject.put("phone", "");
            jsonObject.put("ip", DeviceHelper.getNetworkIP());
        } catch (JSONException e) {
            e.printStackTrace();
        }

        /**
         * {"authorCode":"",
         * "geetest":{"authcode":"0000","process_id":"8280377060b23a85345e84a9532912c6","token":"CM__1__d138d527930c536c21bd47ab1ba2c0a3__2.9.1.1__1__STsid00000017440785119167sOFoi1UQvESId0w8mgvRdn1Pd8zPjCp__NOTCUCC"},
         * "imei":"",
         * "ip":"192.168.1.15",
         * "loginType":4,
         * "phone":"",
         * "source":1,
         * "version":"4.3.0-debug"}
         */
        mainHandler.post(() -> {
            HttpHelper.getInstance().appendUrl(HttpUrl.URL_LOGIN).
                    addJsonParam(jsonObject.toString())
                    .jsonPost(new HttpCallBack<SCUserInfoResponse>(context) {

                        @Override
                        public void onSuccessed(SCUserInfoResponse result) {
                            updateUserInfo(result);
                            end(false);
                        }

                        @Override
                        public void onFailured(String errorCode, String errMsg) {
                            ToastShowUtils.showFailedToast(errMsg);
                            end(true);
                        }


                    });

        });

    }

    private void end(boolean isFail) {
        mainHandler.post(() -> {
            /**
             * 关闭 loading 动画
             */
            OneLoginHelper.with().stopLoading();

            if(isFail){
                goToLogin();
            }
            /**
             * 关闭授权页面
             * sdk内部除了返回或初始化异常以外是不关闭授权页面的，需要开发者自行关闭
             */
            OneLoginHelper.with().dismissAuthActivity();
            onVerifyEnd();
        });
    }

    private void updateUserInfo(BaseResponseModel data) {
        SCUserInfoResponse userInfoResponse = (SCUserInfoResponse) data.getData();

        if (userInfoResponse == null){
            Log.e("updateUserInfo","userInfoResponse == null");
            return;
        }
        SCUserInfoConfig.saveUserinfo(userInfoResponse);  //保存用户信息
        Log.e("updateUserInfo",userInfoResponse.getUsername());
        SPUtils.saveString(context,SPUtils.LAST_PHONE,userInfoResponse.getUsername());
//        SCApplication.getApplication().getPreferenceConfig().setString("account", userInfoResponse.getUsername());
//
//        SCApplication.getApplication().getPreferenceConfig().setString("imUserId", userInfoResponse.getImUserId());
//        SCApplication.getApplication().getPreferenceConfig().setString("imToken", userInfoResponse.getImToken());
//        SCApplication.getApplication().getPreferenceConfig().setString("imTokenExpireTimeSeconds", userInfoResponse.getImTokenExpireTimeSeconds()+"");

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
        String date = df.format(new Date());// new Date()为获取当前系统时间，也可使用当前时间戳
//        SCApplication.getApplication().getPreferenceConfig().setString("messageTime", date);
        SCUserInfoConfig.deleteMessageInfo();

//        try {
//            ReactContext reactContext =  SCApplication.getApplication().getReactNativeHost().getReactInstanceManager().getCurrentReactContext();
//            if (reactContext == null) {
//                return;
//            }
//            WritableMap event = Arguments.createMap();
//            //传递的参数
//            event.putString("appmobile", userInfoResponse.getUsername());
//            event.putString("merchantId", userInfoResponse.getMerchantId()+"");
//            event.putString("userId", userInfoResponse.getUserId()+"");
//            event.putString("sessionId", userInfoResponse.getSessionId()+"");
//            event.putString("merchantName", userInfoResponse.getMerchantName()+"");
//            event.putString("fullName", userInfoResponse.getFullname()+"");
//            reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("loginSuccess", event);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        //登录成功回调

        Intent intent =  new Intent(context, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    /**
     * 一键登录结束
     */
    public void onVerifyEnd() {
        // 回调发往关联的 Activity，可用于更新登录成功后的用户信息，实现 Activity 的 onActivityResult 效果
        if (oneLoginResult != null) {
            oneLoginResult.onResult();
        }
        if (useCustomLoading) {
            if (progressDialog != null) {
                progressDialog.dismiss();
                progressDialog = null;
            }
            // 注意结束时释放引用，避免内存泄漏
            oneLoginActivity = null;
        }
    }

    /**
     * 判断是否有NavigationBar
     *
     * @param activity
     * @return
     */
    public static boolean checkHasNavigationBar(Activity activity) {
        WindowManager windowManager = activity.getWindowManager();
        Display d = windowManager.getDefaultDisplay();

        DisplayMetrics realDisplayMetrics = new DisplayMetrics();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            d.getRealMetrics(realDisplayMetrics);
        }

        int realHeight = realDisplayMetrics.heightPixels;
        int realWidth = realDisplayMetrics.widthPixels;

        DisplayMetrics displayMetrics = new DisplayMetrics();
        d.getMetrics(displayMetrics);

        int displayHeight = displayMetrics.heightPixels;
        int displayWidth = displayMetrics.widthPixels;

        return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
    }

    /**
     * 获得NavigationBar的高度
     */
    public static int getNavigationBarHeight(Activity activity) {
        int result = 0;
        Resources resources = activity.getResources();
        int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
        if (resourceId > 0 && checkHasNavigationBar(activity)) {
            result = resources.getDimensionPixelSize(resourceId);
        }
        return result;
    }
}
